home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special Tips & Tricks for Windows 95 / Chip Wintips.iso / sterown / grafika / w2p_pd13 / pd13.ms_ / pd13.ms
Text File  |  1996-03-25  |  22KB  |  717 lines

  1. '**************************************************************************
  2. '* setup script for POWERdraft for AutoCAD R13 (Win32s & NT)
  3. '**************************************************************************
  4. '*
  5. '* REV:
  6. '* 09.01.95, mk: stolen from POWERdraft R12/Win :-)
  7. '* 19.01.95, mk: added the naming scheme for the new Windows drivers
  8. '* 13.03.95, mk: installation of PD12 _and_ PD13 on one machine didn't work
  9.  
  10. '$DEFINE DEBUG  ''Define for script development/debugging
  11.  
  12. '$INCLUDE 'setupapi.inc'
  13. '$INCLUDE 'msdetect.inc'
  14.  
  15. ''Dialog ID's
  16. CONST LANGUAGE      =  50
  17. CONST WELCOME       = 100
  18. CONST ASKQUIT       = 200
  19. CONST ACADPATH      = 300
  20. CONST DESTPATH      = 350
  21. CONST EXITFAILURE   = 400
  22. CONST EXITQUIT      = 600
  23. CONST EXITOK        = 700
  24. CONST DRVHELP       = 900
  25.  
  26. CONST EXITFAILNOWIN32   = 1100
  27. CONST EXITFAILNOTWIN31  = 1200
  28. CONST EXITFAILNOTELSA   = 1500
  29. CONST EXITFAILOLDDRV31  = 1550
  30. CONST EXITFAILOLDDRV95  = 1560
  31. CONST EXITFAILOLDDRVNT  = 1570
  32. CONST WILLBREAKOLD      = 1600
  33. CONST WILLBREAKNEW      = 1650
  34.  
  35. CONST BADPATH       = 6400
  36.  
  37. ''Bitmap ID
  38. CONST LOGO = 1
  39.  
  40. CONST DRIVERFAMILY  = "POWERdraft for AutoCAD"
  41. CONST DRIVERKEY     = "WinADIR13"
  42. CONST DRIVERNAME    = "POWERdraft for AutoCAD R13"
  43. CONST MINDRVVER31   = "5.20"            '' remember to update dialog EXITFAILOLDDRV31!
  44. CONST MINDRVVER95   = "1.04.002"        '' remember to update dialog EXITFAILOLDDRV95!
  45. CONST MINDRVVERNT   = "3.59.00.00"      '' remember to update dialog EXITFAILOLDDRVNT!
  46.  
  47. GLOBAL CUIDLL$      ''name of custom user interface DLL
  48. GLOBAL DEST$        ''Default destination directory.
  49. GLOBAL DESTACAD$    ''ACAD's home directory.
  50. GLOBAL DESTWIN$     ''Windows directory.
  51. GLOBAL DESTSYS$     ''Windows\System directory.
  52. GLOBAL LANG%        ''language code, is added to every dialog ID
  53. GLOBAL IsWindowsNT% ''We are executed in NT
  54. GLOBAL ExitCode%    ''global error code
  55.  
  56. DECLARE SUB Install
  57. DECLARE SUB UpdateELSADisp
  58. DECLARE SUB UpdateSystemIni
  59. DECLARE SUB RebootSystem
  60. DECLARE FUNCTION NeedELSADisp AS INTEGER
  61. DECLARE FUNCTION NeedNewWin32s AS INTEGER
  62. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  63. DECLARE FUNCTION OnWindows95 AS INTEGER
  64. DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  65. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  66.  
  67. DECLARE FUNCTION GlobalFindAtom LIB "USER" (arg1$) AS INTEGER
  68.  
  69.  
  70. INIT:
  71.  
  72. ''dummy% = DoMsgBox("MK's MessageBox template", "DEBUG", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  73.  
  74.     CUIDLL$ = "mscuistf.dll"            ''Custom user interface dll
  75.     HELPPROC$ = "FHelpDlgProc"        ''Help dialog procedure
  76.     IsWindowsNT% = 0
  77.     ExitCode% = EXITFAILURE
  78.     ON ERROR GOTO ERRNORMAL
  79.  
  80.     '' build a global list of ELSA system components used by this driver
  81.     AddListItem "USES", "DRWh"
  82.     AddListItem "USES", "DL32h"
  83.  
  84.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  85.  
  86.     SetBitmap CUIDLL$, LOGO
  87.     SetTitle DRIVERFAMILY
  88.  
  89.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  90.     IF szInf$ = "" THEN
  91.     szInf$ = GetSymbolValue("STF_CWDDIR") + "PD13.INF"
  92.     END IF
  93.     ReadInfFile szInf$
  94.  
  95.     LANG% = 0
  96.     DEST$ = "C:\WINNER\WINADI\"
  97.     DESTWIN$ = GetWindowsDir()
  98.     DESTSYS$ = GetWindowsSysDir()
  99.  
  100. '$IFDEF DEBUG
  101.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  102.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  103.     IF IsDriveValid(WinDrive$) = 0 THEN
  104.     i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  105.     GOTO QUIT
  106.     END IF
  107. '$ENDIF ''DEBUG
  108.  
  109.  
  110. LANGUAGE:
  111.     langstr$ = STR$(LANG% + 1)
  112.     SetSymbolValue "RadioDefault", langstr$
  113. LANGL1:
  114.     sz$ = UIStartDlg(CUIDLL$, LANGUAGE, "FRadioDlgProc", 0, "")
  115.     langstr$ = GetSymbolValue("ButtonChecked")
  116.     LANG% = VAL(LANGSTR$) - 1
  117.  
  118.     IF sz$ = "CONTINUE" THEN
  119.         UIPop(1)
  120.     ELSEIF sz$ = "REACTIVATE" THEN
  121.         GOTO LANGL1
  122.     ELSE
  123.         GOSUB ASKQUIT
  124.         GOTO LANGUAGE
  125.     END IF
  126.  
  127.  
  128. WELCOME:
  129.     sz$ = UIStartDlg(CUIDLL$, WELCOME+LANG%, "FInfoDlgProc", DRVHELP+LANG%, HELPPROC$)
  130.     IF sz$ = "CONTINUE" THEN
  131.         UIPop 1
  132.     ELSEIF sz$ = "REACTIVATE" THEN
  133.         GOTO WELCOME
  134.     ELSEIF sz$ = "BACK" THEN
  135.         UIPop 1
  136.         GOTO LANGUAGE
  137.     ELSE
  138.         GOSUB ASKQUIT
  139.         GOTO WELCOME
  140.     END IF
  141.  
  142. CHECK:
  143.     IF OnWindowsNT() THEN
  144.         DESTSYS$ = DESTWIN$ + "system32"
  145.         IF MID$(DESTSYS$, LEN(DESTSYS$), 1) <> "\" THEN
  146.             DESTSYS$ = DESTSYS$ + "\"
  147.         END IF
  148.         IsWindowsNT% = 1
  149.         GOTO CHECKDRIVER
  150.     END IF
  151.     IF GetWindowsMajorVersion < 3 THEN
  152.         ExitCode% = EXITFAILNOTWIN31
  153.         GOTO QUIT
  154.     END IF
  155.     IF GetWindowsMajorVersion = 3 AND GetWindowsMinorVersion < 1 THEN
  156.         ExitCode% = EXITFAILNOTWIN31
  157.         GOTO QUIT
  158.     END IF
  159.     IF GetWindowsMajorVersion >= 4 THEN
  160.         ExitCode% = EXITFAILNOTWIN31
  161.         GOTO QUIT
  162.     END IF
  163.     '' If Win32s is already installed, get running version number
  164.     IF DoesFileExist(DESTSYS$ + "W32SYS.DLL", femExists) THEN
  165.         szOldVer$ ="1.00.000     "  ''Reserve space in string for version
  166.         i% = IsWin32sLoaded( szOldVer$ )
  167.         IF i% = 0 THEN
  168.             ExitCode% = EXITFAILNOWIN32
  169.             GOTO QUIT
  170.         END IF
  171.     END IF
  172.  
  173. CHECKDRIVER:
  174.     IF GlobalFindAtom( "ELSA_Driver" ) = 0 THEN
  175.         ExitCode% = EXITFAILOLDDRVNT
  176.         GOTO QUIT
  177.     END IF
  178.     GOTO CHECKDONE
  179.  
  180.     ''!!mb: here the display driver version should be checked !!!!
  181.  
  182. CHECKDONE:
  183.  
  184.     '' try to find AutoCAD, if it fails keep string empty
  185.     '' typical entry in WIN.INI is:
  186.     ''   [Extensions]
  187.     ''   dwg=D:\ACAD\R12C1WUS\acad.exe ^.dwg
  188.     '' or
  189.     ''   dwg=D:\ACAD\LTWIN\aclt.exe ^.dwg
  190.     DESTACAD$ = UCASE$( GetIniKeyString( "WIN.INI", "Extensions", "dwg" ) )
  191.     IF INSTR( DESTACAD$, "\ACAD.EXE" ) <> 0 THEN
  192.     DESTACAD$ = MID$( DESTACAD$, 1,  INSTR( DESTACAD$, "\ACAD.EXE" ) )
  193.     ELSE
  194.         DESTACAD$ = ""
  195.     END IF
  196.  
  197. GETACAD:
  198.     SetSymbolValue "EditTextIn", DESTACAD$
  199.     SetSymbolValue "EditFocus", "END"
  200. GETACADL1:
  201.     sz$ = UIStartDlg(CUIDLL$, ACADPATH+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  202.     DESTACAD$ = LTRIM$(RTRIM$(UCASE$( GetSymbolValue("EditTextOut") )))
  203.     IF sz$ = "CONTINUE" THEN
  204.         IF DESTACAD$ = "" THEN
  205.             GOSUB BADPATH
  206.             GOTO GETACADL1
  207.         END IF
  208.         IF MID$(DESTACAD$, LEN(DESTACAD$), 1) <> "\" THEN
  209.             DESTACAD$ = DESTACAD$ + "\"
  210.         END IF
  211.     IF DoesDirExist(DESTACAD$) = 0 THEN
  212.         GOSUB BADPATH
  213.         GOTO GETACADL1
  214.     END IF
  215.         IF DoesFileExist(DESTACAD$+"ACAD.EXE",femExist)=0 AND DoesFileExist(DESTACAD$+"ACAD.INI",femExist)=0 THEN
  216.         GOSUB BADPATH
  217.         GOTO GETACADL1
  218.     END IF
  219.     '' R12 has a ACAD.DLL
  220.     IF DoesFileExist( DESTACAD$ + "ACAD.DLL", femExist ) THEN
  221.         GOSUB BADPATH
  222.         GOTO GETACADL1
  223.     END IF
  224.     UIPop 1
  225.     ELSEIF sz$ = "REACTIVATE" THEN
  226.     GOTO GETACADL1
  227.     ELSEIF sz$ = "BACK" THEN
  228.     UIPop 1
  229.     GOTO WELCOME
  230.     ELSE
  231.     GOSUB ASKQUIT
  232.     GOTO GETACAD
  233.     END IF
  234.  
  235.  
  236. GETPATH:
  237.     SetSymbolValue "EditTextIn", DEST$
  238.     SetSymbolValue "EditFocus", "END"
  239. GETPATHL1:
  240.     sz$ = UIStartDlg(CUIDLL$, DESTPATH+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  241.     DEST$ = LTRIM$(RTRIM$(UCASE$( GetSymbolValue("EditTextOut") )))
  242.     IF sz$ = "CONTINUE" THEN
  243.         IF DEST$ = "" THEN
  244.             GOSUB BADPATH
  245.             GOTO GETPATHL1
  246.         END IF
  247.         IF MID$(DEST$, LEN(DEST$), 1) <> "\" THEN
  248.             DEST$ = DEST$ + "\"
  249.         END IF
  250.     IF IsDirWritable(DEST$) = 0 THEN
  251.         GOSUB BADPATH
  252.         GOTO GETPATHL1
  253.     END IF
  254.     UIPop 1
  255.     ELSEIF sz$ = "REACTIVATE" THEN
  256.     GOTO GETPATHL1
  257.     ELSEIF sz$ = "BACK" THEN
  258.     UIPop 1
  259.     GOTO GETACAD
  260.     ELSE
  261.     GOSUB ASKQUIT
  262.     GOTO GETPATH
  263.     END IF
  264.  
  265. CHECKDISP:
  266.     IF NeedELSADisp() = -1 THEN
  267.     ExitCode% = EXITQUIT
  268.     GOTO QUIT
  269.     END IF
  270.  
  271.  
  272. DOINSTALL:
  273.     Install
  274.  
  275.  
  276. QUIT:
  277.     ON ERROR GOTO ERRQUIT
  278.  
  279.     IF ERR = 0 THEN
  280.     dlg% = ExitCode%
  281.     ELSEIF ERR = STFQUIT THEN
  282.     dlg% = EXITQUIT
  283.     ExitCode% = EXITQUIT
  284.     ELSE
  285.         i% = DoMsgBox("Internal error: "+ERROR$ +" ("+STR$(ERR)+") in line "+STR$(ERL), "Runtime error", MB_OK+MB_TASKMODAL+MB_ICONINFORMATION)
  286.     dlg% = EXITFAILURE
  287.     ExitCode% = EXITQUIT
  288.     END IF
  289. QUITL1:
  290.     sz$ = UIStartDlg(CUIDLL$, dlg%+LANG%, "FInfo0DlgProc", 0, "")
  291.     IF sz$ = "REACTIVATE" THEN
  292.     GOTO QUITL1
  293.     END IF
  294.     UIPop 1
  295.  
  296.     END
  297.  
  298.  
  299. '*****************************************************************************
  300.  
  301.  
  302. ERRQUIT:
  303.     i% = DoMsgBox("Setup sources were corrupted, call your dealer!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  304.     END
  305.  
  306.  
  307. '' Bypass run-time errors. Let final dialog box display fatal error message.
  308. ERRNORMAL:
  309.     '' Check if user cancelled setup
  310.     IF ERR = STFQUIT THEN
  311.     GOTO QUIT
  312.     END IF
  313.     RESUME NEXT
  314.  
  315.  
  316. BADPATH:
  317.     sz$ = UIStartDlg(CUIDLL$, BADPATH+LANG%, "FInfo0DlgProc", 0, "")
  318.     IF sz$ = "REACTIVATE" THEN
  319.         GOTO BADPATH
  320.     END IF
  321.     UIPop 1
  322.     RETURN
  323.  
  324.  
  325. ASKQUIT:
  326.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT+LANG%, "FQuitDlgProc", 0, "")
  327.  
  328.     IF sz$ = "EXIT" THEN
  329.     UIPopAll
  330.     ERROR STFQUIT
  331.     ELSEIF sz$ = "REACTIVATE" THEN
  332.     GOTO ASKQUIT
  333.     ELSE
  334.     UIPop 1
  335.     END IF
  336.     RETURN
  337.  
  338.  
  339.  
  340. '**
  341. '** Purpose:
  342. '**     Builds the copy list and performs all installation operations.
  343. '** Arguments:
  344. '**     none.
  345. '** Returns:
  346. '**     none.
  347. '*************************************************************************
  348. SUB Install STATIC
  349.  
  350.     ExitCode% = EXITFAILURE
  351.  
  352.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  353.  
  354.     '' let's start with POWERdraft files
  355.     CreateDir DEST$, cmoNone
  356.  
  357.     OpenLogFile DEST$ + "PD13.LOG", 0
  358.     WriteToLogFile ""
  359.     WriteToLogFile "  Source directory:      '" + SrcDir$ + "'"
  360.     WriteToLogFile "  Destination directory: '" + DEST$ + "'"
  361.     WriteToLogFile "  AutoCAD directory:     '" + DESTACAD$ + "'"
  362.     WriteToLogFile "  Windows directory:     '" + DESTWIN$ + "'"
  363.     WriteToLogFile "  Windows sys directory: '" + DESTSYS$ + "'"
  364.     WriteToLogFile ""
  365.  
  366.     '' Gimme a second, need to clean up a problem of early SETUPs
  367.     IF IsWindowsNT% = 0 THEN
  368.     WriteToLogFile "'' fix wrong installation of early SETUP versions"
  369.     FOR i%=1 TO GetListLength("USES") STEP 1
  370.         Component$ = GetListItem( "USES", i% )
  371.         MakeListFromSectionFilename "MOVEFILES", Component$
  372.         FOR j%=1 TO GetListLength("MOVEFILES") STEP 1
  373.         szFile$ = GetListItem( "MOVEFILES", j% )
  374.         IF DoesFileExist(DESTSYS$ + szFile$,femExist) THEN
  375.             CopyFile DESTSYS$ + szFile$, DESTWIN$ + szFile$, cmoNone,0
  376.             RemoveFile DESTSYS$ + szFile$, cmoNone
  377.         END IF
  378.         NEXT j%
  379.         RemoveSymbol "MOVEFILES"
  380.     NEXT i%
  381.     END IF
  382.  
  383.     AddSectionFilesToCopyList DRIVERKEY, SrcDir$, DEST$
  384.  
  385.     FOR i%=1 TO GetListLength("USES") STEP 1
  386.     Component$ = GetListItem( "USES", i% )
  387.     IF IsWindowsNT% = 1 THEN
  388.         AddSectionFilesToCopyList Component$, SrcDir$, DESTSYS$
  389.     ELSE
  390.         '' in Win3.1 DESTWIN$ is the local directory,
  391.         '' DESTSYS$ might be on the network
  392.         AddSectionFilesToCopyList Component$, SrcDir$, DESTWIN$
  393.     END IF
  394.     NEXT i%
  395.  
  396.     '' next line is a debugging aid:
  397.     '' DumpCopyList DEST$ + "PD13.LST"
  398.     CopyFilesInCopyList
  399.     IF ERR <> 0 THEN
  400.     EXIT SUB
  401.     END IF
  402.  
  403.  
  404.     '' if copy succeeded, do all INI changes, first for POWERdraft ...
  405.     ini$ = DESTWIN$ + "DSELSA13.INI"
  406.     CreateIniKeyValue ini$, "POWERdraft", "Cockpit", "1", cmoNone
  407.  
  408.     '' maintain our ELSADISP.INI
  409.     UpdateELSADisp
  410.  
  411.     IF DESTACAD$ <> "" THEN
  412.     ini$ = MakePath(DESTACAD$, "ACAD.INI")
  413.     acadsect$ = "General"
  414.  
  415.     '' append destination path to AutoCAD's key ACADDRV in ACAD.INI
  416.     acaddrv$ = UCASE$( GetIniKeyString( ini$, acadsect$, "ACADDRV" ) )
  417.     '' this is to fix a bug in R13 initial version, they do not include
  418.     '' .\DRV in ACADDRV - no idea how they find the drivers anyway -
  419.     '' at least when we add our dir, the drivers in .\DRV are inaccessible
  420.     IF INSTR( acaddrv$, ";" ) = 0 THEN
  421.         acaddrv$ = acaddrv$ + ";" + DESTACAD$
  422.     END IF
  423.     IF INSTR( acaddrv$, DEST$ ) = 0 THEN
  424.         acaddrv$ = acaddrv$ + ";" + DEST$
  425.     END IF
  426.     CreateIniKeyValue ini$, acadsect$, "ACADDRV", acaddrv$, cmoOverwrite
  427.  
  428.     '' We do not support Autodesk's aerial view, so turn it off!
  429.     CreateIniKeyValue ini$, "Aerial View", "Enabled", "0", cmoOverwrite
  430.  
  431. ''!! FIXME: replace _DSVIEWER with SUPERVIEW, add some icons?
  432.     IF GetIniKeyString( ini$, acadsect$, "ToolBar1" ) = "" THEN
  433.  
  434.         ' they have a built in default of 17 buttons
  435. ''!!        CreateIniKeyValue ini$, acadsect$, "ToolBar18", "'Cockpit #C", cmoOverwrite
  436. ''!!        CreateIniKeyValue ini$, acadsect$, "ToolBar19", "'MagniView #M", cmoOverwrite
  437.  
  438.     ELSE
  439.  
  440.         ' user already changed buttons that made ACAD write list to ini file
  441.         FOR i%=1 TO 26 STEP 1
  442.         tb_key$ = "ToolBar" + LTRIM$(RTRIM$( STR$(i) ))
  443.         tb_val$ = UCASE$( GetIniKeyString( ini$, acadsect$, tb_key$ ) )
  444.         IF INSTR( tb_val$, "COCKPIT" ) THEN
  445.             EXIT FOR
  446.         END IF
  447.         IF tb_val$ = "" THEN
  448.             CreateIniKeyValue ini$, acadsect$, tb_key$, "'Cockpit #C", cmoOverwrite
  449.             EXIT FOR
  450.         END IF
  451.         NEXT i%
  452.         FOR i%=1 TO 26 STEP 1
  453.         tb_key$ = "ToolBar" + LTRIM$(RTRIM$( STR$(i) ))
  454.         tb_val$ = UCASE$( GetIniKeyString( ini$, acadsect$, tb_key$ ) )
  455.         IF INSTR( tb_val$, "MAGNIVIEW" ) THEN
  456.             EXIT FOR
  457.         END IF
  458.         IF tb_val$ = "" THEN
  459.             CreateIniKeyValue ini$, acadsect$, tb_key$, "'MagniView #M", cmoOverwrite
  460.             EXIT FOR
  461.         END IF
  462.         NEXT i%
  463.  
  464.     END IF
  465.  
  466.     '' modify AutoCAD's menu file, but keep a copy!
  467. ''!!    IF DoesFileExist(DESTACAD$ + "acad_o.mnu",femExists) = 0 THEN
  468. ''!!        RenameFile DESTACAD$ + "acad.mnu", "acad_o.mnu"
  469. ''!!    ELSE
  470. ''!!        CopyFile DESTACAD$ + "acad.mnu", DESTACAD$ + "acad_o.mnu"
  471. ''!!    END IF
  472. ''!! modify menu file here: DSVIEWER -> SUPERVIEW, +MAGNIVIEW, +COCKPIT
  473.  
  474.     END IF
  475.  
  476.     '' put a help file icon into AutoCAD group in ProgMangler
  477.     IF LANG%=1 THEN
  478.     helpfile$ = DEST$ + "lang13de.hlp"
  479.     ELSE
  480.     helpfile$ = DEST$ + "lang13en.hlp"
  481.     END IF
  482.     CreateProgmanItem "AutoCAD R13", DRIVERNAME, helpfile$, "", cmoOverwrite
  483.  
  484.     ExitCode% = EXITOK
  485.  
  486.     CloseLogFile
  487.  
  488. END SUB
  489.  
  490.  
  491. '**
  492. '** Purpose:
  493. '**     Check versions of our system components and handle compatibility
  494. '**     conflicts
  495. '** Arguments:
  496. '**     -
  497. '** Returns:
  498. '**     0 for no install needed, 1 for install required, -1 for abort
  499. '*************************************************************************
  500. FUNCTION NeedELSADisp STATIC AS INTEGER
  501.  
  502.     ReturnValue% = 1
  503.  
  504.     '' we have version numbers of all components in our INI file ELSADISP.INI
  505.     '' use this to check for incompatible updates
  506.     ELSAdisp$ = DESTWIN$ + "ELSADISP.INI"
  507.     IF DoesFileExist(ELSAdisp$,femExist) THEN
  508.     IF DoesFileExist(ELSAdisp$,femReadWrite) = 0 THEN
  509.         i% = DoMsgBox( "ABORT: " + ELSAdisp$ + " is write protected!", "Fatal Error", MB_ICONSTOP+MB_TASKMODAL)
  510.         NeedELSADisp = -1
  511.         EXIT FUNCTION
  512.     END If
  513.     END IF
  514.  
  515.     '' Check versions of system components,
  516.     '' use the file marked "VERCHECK" in each group
  517.     FOR i%=1 TO GetListLength("USES") STEP 1
  518.  
  519.     Component$ = GetListItem( "USES", i% )
  520.     usedby$ = GetIniKeyString( ELSAdisp$, Component$, "UsedBy" )
  521.  
  522.     '' get compatibility levels
  523.     szNewVer$ = GetSectionKeyVersion(Component$,"VERCHECK")
  524.     IF IsWindowsNT% = 1 THEN
  525.         szOldVer$ = GetVersionOfFile( DESTSYS$ + GetSectionKeyFileName(Component$,"VERCHECK") )
  526.     ELSE
  527.         szOldVer$ = GetVersionOfFile( DESTWIN$ + GetSectionKeyFileName(Component$,"VERCHECK") )
  528.         '' Once upon a time we had a broken SETUP ...
  529.         '' that installed to DESTSYS instead of DESTWIN, so look there too,
  530.         '' we will move the files in subroutine Install
  531.         IF szOldVer$ = "" THEN
  532.         szOldVer$ = GetVersionOfFile( DESTSYS$ + GetSectionKeyFileName(Component$,"VERCHECK") )
  533.         END IF
  534.     END IF
  535.     '' can not be incompatible if it is not installed ...
  536.     IF szOldVer$ <> "" THEN
  537.         szNewLev& = GetVersionNthField( szNewVer$, 1 )
  538.         szOldLev& = GetVersionNthField( szOldVer$, 1 )
  539.         '' remember incompatible components in a list
  540.         IF szNewLev& <> szOldLev& THEN
  541.         AddListItem "COMPLEVEL", Component$
  542.         ReturnValue% = 2
  543.         ENDIF
  544.  
  545.         '' build list of broken apps
  546.         FOR j% = 1 TO 999 STEP 1
  547.         app$ = GetNthFieldFromIniString( usedby$, j% )
  548.         IF app$ = "" THEN
  549.             EXIT FOR
  550.         END IF
  551.         AppName$ = GetIniKeyString( ELSAdisp$, app$, "FullName" )
  552.         IF szNewLev& > szOldLev& THEN
  553.             ''add every app only once ...
  554.             IF INSTR(OldApps$,AppName$) = 0 THEN
  555.             ''... and never ourselves
  556.             IF AppName$<>DRIVERNAME THEN
  557.                 OldApps$ = OldApps$ + AppName$ + ";"
  558.             END IF
  559.             END IF
  560.         ELSEIF szNewLev& < szOldLev& THEN
  561.             '' oh shit, we are really old!
  562.             IF INSTR( NewApps$, AppName$ ) = 0 THEN
  563.             IF AppName$<>DRIVERNAME THEN
  564.                 NewApps$ = NewApps$ + AppName$ + ";"
  565.             END IF
  566.             END IF
  567.         END IF
  568.         NEXT j%
  569.     END IF
  570.  
  571.     NEXT i%
  572.  
  573.     IF OldApps$ <> "" THEN
  574. BROKENOLD:
  575.     ''convert our string delimited with ";" into a Symbol table list
  576.     RemoveSymbol "ListItemsIn"
  577.     WHILE OldApps$ <> ""
  578.         i% = INSTR( OldApps$, ";" )
  579.         AppName$ = MID$( OldApps$, 1, i%-1 )
  580.         AddListItem "ListItemsIn", AppName$
  581.         OldApps$ = MID$( OldApps$, i%+1 )
  582.     WEND
  583.     sz$ = UIStartDlg(CUIDLL$, WILLBREAKOLD+LANG%, "FListDlgProc", 0, "")
  584.     IF sz$ = "CONTINUE" THEN
  585.         UIPop 1
  586.     ELSEIF sz$ = "REACTIVATE" THEN
  587.         GOTO BROKENOLD
  588.     ELSE
  589.         UIPop 1
  590.         ReturnValue% = -1
  591.     END IF
  592.     END IF
  593.     IF NewApps$ <> "" THEN
  594. BROKENNEW:
  595.     RemoveSymbol "ListItemsIn"
  596.     WHILE NewApps$ <> ""
  597.         i% = INSTR( NewApps$, ";" )
  598.         AppName$ = MID$( NewApps$, 1, i%-1 )
  599.         AddListItem "ListItemsIn", AppName$
  600.         NewApps$ = MID$( NewApps$, i%+1 )
  601.     WEND
  602.     sz$ = UIStartDlg(CUIDLL$, WILLBREAKNEW+LANG%, "FListDlgProc", 0, "")
  603.     IF sz$ = "CONTINUE" THEN
  604.         UIPop 1
  605.     ELSEIF sz$ = "REACTIVATE" THEN
  606.         GOTO BROKENNEW
  607.     ELSE
  608.         UIPop 1
  609.         ReturnValue% = -1
  610.     END IF
  611.     END IF
  612.  
  613.     '' If user decided to continue installation (breaking another app)
  614.     '' delete the old system files to make sure they will be copied.
  615.     '' Otherwise the filedate check would not allow to install older files.
  616.     IF ReturnValue% = 2 THEN
  617.     FOR i%=1 TO GetListLength("COMPLEVEL") STEP 1
  618.         Component$ = GetListItem( "COMPLEVEL", i% )
  619.         MakeListFromSectionFilename "COMPFILES", Component$
  620.         FOR j%=1 TO GetListLength("COMPFILES") STEP 1
  621.         IF IsWindowsNT% = 1 THEN
  622.             szFile$ = DESTSYS$ + GetListItem( "COMPFILES", j% )
  623.         ELSE
  624.             szFile$ = DESTWIN$ + GetListItem( "COMPFILES", j% )
  625.         END IF
  626.         IF DoesFileExist(szFile$,femReadWrite) THEN
  627.             RemoveFile szFile$, cmoVital
  628.         END IF
  629.         NEXT j%
  630.         RemoveSymbol "COMPFILES"
  631.     NEXT i%
  632.     RemoveSymbol "COMPLEVEL"
  633.  
  634.     ReturnValue% = 1
  635.     END IF
  636.  
  637.     NeedELSADisp = ReturnValue%
  638.  
  639. END FUNCTION
  640.  
  641.  
  642. '**
  643. '** Purpose:
  644. '**     Create or update ELSADISP.INI, this is where we note cross
  645. '**     dependencies and support detection of version conflicts.
  646. '** Arguments:
  647. '**     -
  648. '** Returns:
  649. '**     -
  650. '*************************************************************************
  651. SUB UpdateELSADisp STATIC
  652.  
  653.     '' save version numbers of all components to our INI file ELSADISP.INI
  654.     '' this can be used to check for incompatible updates, see NeedELSADisp()
  655.     ELSAdisp$ = DESTWIN$ + "ELSADISP.INI"
  656.  
  657.     szNewVer$ = GetSectionKeyVersion(DRIVERKEY,"VERCHECK")
  658.     CreateIniKeyValue ELSAdisp$, DRIVERKEY, "Version", szNewVer$, cmoOverwrite
  659.     CreateIniKeyValue ELSAdisp$, DRIVERKEY, "FullName", DRIVERNAME, cmoOverwrite
  660.  
  661.     uses$ = ""
  662.     FOR i%=1 TO GetListLength("USES") STEP 1
  663.     Component$ = GetListItem( "USES", i% )
  664.     uses$ = uses$ + "," + Component$
  665.     szNewVer$ = GetSectionKeyVersion(Component$,"VERCHECK")
  666.     CreateIniKeyValue ELSAdisp$, Component$, "Version", szNewVer$, cmoOverwrite
  667.     usedby$ = GetIniKeyString( ELSAdisp$, Component$, "UsedBy" )
  668.     IF usedby$ = "" THEN
  669.         usedby$ = DRIVERKEY
  670.     ELSEIF INSTR( usedby$, DRIVERKEY ) = 0 THEN
  671.         usedby$ = usedby$ + "," + DRIVERKEY
  672.     END IF
  673.     CreateIniKeyValue ELSAdisp$, Component$, "UsedBy", usedby$, cmoOverwrite
  674.     NEXT i%
  675.     CreateIniKeyValue ELSAdisp$, DRIVERKEY, "Uses", MID$(uses$,2), cmoOverwrite
  676.  
  677. END SUB
  678.  
  679.  
  680. '**
  681. '** Purpose:
  682. '**     Appends a file name to the end of a directory path,
  683. '**     inserting a backslash character as needed.
  684. '** Arguments:
  685. '**     szDir$  - full directory path (with optional ending "\")
  686. '**     szFile$ - filename to append to directory
  687. '** Returns:
  688. '**     Resulting fully qualified path name.
  689. '*************************************************************************
  690. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  691.     IF szDir$ = "" THEN
  692.     MakePath = szFile$
  693.     ELSEIF szFile$ = "" THEN
  694.     MakePath = szDir$
  695.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  696.     MakePath = szDir$ + szFile$
  697.     ELSE
  698.     MakePath = szDir$ + "\" + szFile$
  699.     END IF
  700. END FUNCTION
  701.  
  702.  
  703. '**
  704. '** Purpose:
  705. '**     checks whether win95 is running or not
  706. '** Returns:
  707. '**     1: win95 is running
  708. '**     0: else
  709. '*************************************************************************
  710. FUNCTION OnWindows95() STATIC AS INTEGER
  711.     IF GetWindowsMajorVersion = 3 AND GetWindowsMinorVersion = 95 THEN
  712.         OnWindows95 = 1
  713.     ELSE
  714.         OnWindows95 = 0
  715.     END IF
  716. END FUNCTION
  717.